/**
 * Copyright(c) Live2D Inc. All rights reserved.
 *
 * Use of this source code is governed by the Live2D Open Software license
 * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
 */

#include "CubismRenderer.hpp"

#include "CubismFramework.hpp"
#include "Model/CubismModel.hpp"

//------------ LIVE2D NAMESPACE ------------
namespace Live2D
{
    namespace Cubism
    {
        namespace Framework
        {
            namespace Rendering
            {

                void CubismRenderer::Delete(CubismRenderer *renderer)
                {
                    CSM_DELETE_SELF(CubismRenderer, renderer);
                }

                CubismRenderer::CubismRenderer()
                    : _isCulling(false), _isPremultipliedAlpha(false), _anisotropy(0.0f), _model(NULL), _useHighPrecisionMask(false)
                {
                    //単位行列に初期化
                    _mvpMatrix4x4.LoadIdentity();
                }

                CubismRenderer::~CubismRenderer()
                {
                }

                void CubismRenderer::Initialize(Framework::CubismModel *model)
                {
                    _model = model;
                }

                void CubismRenderer::DrawModel()
                {
                    if (GetModel() == NULL)
                        return;

                    /**
                     * DoDrawModelの描画前と描画後に以下の関数を呼んでください。
                     * ・SaveProfile();
                     * ・RestoreProfile();
                     * これはレンダラの描画設定を保存・復帰させることで、
                     * モデル描画直前の状態に戻すための処理です。
                     */

                    SaveProfile();

                    DoDrawModel();

                    RestoreProfile();
                }

                void CubismRenderer::SetMvpMatrix(CubismMatrix44 *matrix4x4)
                {
                    _mvpMatrix4x4.SetMatrix(matrix4x4->GetArray());
                }

                CubismMatrix44 CubismRenderer::GetMvpMatrix() const
                {
                    return _mvpMatrix4x4;
                }

                void CubismRenderer::SetModelColor(csmFloat32 red, csmFloat32 green, csmFloat32 blue, csmFloat32 alpha)
                {
                    if (red < 0.0f)
                        red = 0.0f;
                    else if (red > 1.0f)
                        red = 1.0f;

                    if (green < 0.0f)
                        green = 0.0f;
                    else if (green > 1.0f)
                        green = 1.0f;

                    if (blue < 0.0f)
                        blue = 0.0f;
                    else if (blue > 1.0f)
                        blue = 1.0f;

                    if (alpha < 0.0f)
                        alpha = 0.0f;
                    else if (alpha > 1.0f)
                        alpha = 1.0f;

                    _modelColor.R = red;
                    _modelColor.G = green;
                    _modelColor.B = blue;
                    _modelColor.A = alpha;
                }

                CubismRenderer::CubismTextureColor CubismRenderer::GetModelColor() const
                {
                    return _modelColor;
                }

                void CubismRenderer::IsPremultipliedAlpha(bool enable)
                {
                    _isPremultipliedAlpha = enable;
                }

                bool CubismRenderer::IsPremultipliedAlpha() const
                {
                    return _isPremultipliedAlpha;
                }

                void CubismRenderer::IsCulling(bool culling)
                {
                    _isCulling = culling;
                }

                bool CubismRenderer::IsCulling() const
                {
                    return _isCulling;
                }

                void CubismRenderer::SetAnisotropy(csmFloat32 n)
                {
                    _anisotropy = n;
                }

                csmFloat32 CubismRenderer::GetAnisotropy() const
                {
                    return _anisotropy;
                }

                CubismModel *CubismRenderer::GetModel() const
                {
                    return _model;
                }

                void CubismRenderer::UseHighPrecisionMask(bool high)
                {
                    _useHighPrecisionMask = high;
                }

                bool CubismRenderer::IsUsingHighPrecisionMask()
                {
                    return _useHighPrecisionMask;
                }

            } // namespace Rendering
        }     // namespace Framework
    }         // namespace Cubism
} // namespace Live2D

//------------ LIVE2D NAMESPACE ------------
